using UnityEngine;
using UnityEngine.InputSystem;

public class Lesson10 : MonoBehaviour
{
    PlayerInput input;
    InputAction inputMove;
    void Start()
    {
        #region Send Message
        // 在自定义脚本中
        // 申明名为`On+行为名`的函数
        // 没有参数或者 参数类型为`InputValue`
        // 将该自定义脚本挂载到`PlayerInput`依附的对象上
        // 当触发对应输入时会自动调用函数

        // 并且还有默认的3个和设备相关的函数可以调用
        // 设备注册（当控制器从设备丢失中恢复并再次运行时会触发）：`OnDeviceRegained(PlayerInputinput）`
        // 设备丢失（玩家失去了分配给它的设备之一，例如，当无线设备耗尽电池时）：`OnDeviceLost(PlayerInputinput）`
        // 控制器切换：`OnControlsChanged(PlayerInput input)`
        #endregion

        #region Broadcast Message
        // 基本和`SendMessage`规则一致
        // 唯一的区别是，自定脚本不仅可以挂载在`PlayerInput`依附的对象上
        // 还可以挂载在其子对象下
        #endregion

        #region Invoke UnityEvent Actions
        // 该模式可以让我们在 `Inspector` 窗口上通过拖拽的形式关联响应函数
        // 但是注意：响应函数的参数类型需要改为 `InputAction.CallbackContext`
        #endregion

        #region Invoke CSharp Events
        // 获取PlayerInput组件
        input = this.GetComponent<PlayerInput>();
        inputMove = input.currentActionMap["Move"];
        // 获取对应事件进行委托函数添加
        input.onDeviceRegained += EventDeviceRegained;
        input.onDeviceLost += EventDeviceLost;
        input.onControlsChanged += EventControlsChanged;
        input.onActionTriggered += EventActionTrigger;
        // 当触发输入时会自动触发事件调用对应函数
        #endregion

        #region 关键参数 InputValue和InputAction.CallbackContext

        #endregion
    }

    #region SendMessage
    public void OnDeviceRegained(PlayerInput input)
    {
        Debug.LogFormat("设备注册");
    }

    public void OnDeviceLost(PlayerInput input)
    {
        Debug.LogFormat("设备丢失");
    }

    public void OnControlsChanged(PlayerInput input)
    {
        Debug.LogFormat("控制器切换");
    }

    public void OnMove(InputValue value)
    {
        Debug.LogFormat("Move value:{0}", value.Get<Vector2>());
    }

    public void OnFire(InputValue value)
    {
        Debug.LogFormat("OnFire isPressed:{0}", value.isPressed);
    }

    public void OnLook(InputValue value)
    {
        Debug.LogFormat("OnLook value:{0}", value.Get<Vector2>());
    }
    #endregion

    #region Invoke UnityEvent Actions
    public void MyDeviceRegained(PlayerInput input)
    {
        Debug.LogFormat("My-设备注册");
    }

    public void MyDeviceLost(PlayerInput input)
    {
        Debug.LogFormat("My-设备丢失");
    }

    public void MyControlsChanged(PlayerInput input)
    {
        Debug.LogFormat("My-控制器切换");
    }

    public void MyMove(InputAction.CallbackContext context)
    {
        Debug.LogFormat("MyMove value:{0}", context.ReadValue<Vector2>());
    }

    public void MyFire(InputAction.CallbackContext context)
    {
        Debug.LogFormat("MyFire");
    }

    public void MyLook(InputAction.CallbackContext context)
    {
        Debug.LogFormat("MyLook");
    }
    #endregion

    #region Invoke CSharp Events
    public void EventDeviceRegained(PlayerInput input)
    {
        Debug.LogFormat("Event-设备注册");
    }

    public void EventDeviceLost(PlayerInput input)
    {
        Debug.LogFormat("Event-设备丢失");
    }

    public void EventControlsChanged(PlayerInput input)
    {
        Debug.LogFormat("Event-控制器切换");
    }

    public void EventMove(InputAction.CallbackContext context)
    {
        Debug.LogFormat("EventMove");
    }

    public void EventFire(InputAction.CallbackContext context)
    {
        Debug.LogFormat("EventFire");
    }

    public void EventLook(InputAction.CallbackContext context)
    {
        Debug.LogFormat("EventLook");
    }

    public void EventActionTrigger(InputAction.CallbackContext context)
    {
        Debug.LogFormat("EventActionTrigger action:{0}", context.action.name);
        Debug.LogFormat("EventActionTrigger control:{0}", context.control.name);
        switch (context.action.name)
        {
            case "Fire":
                Debug.LogFormat("EventActionTrigger Fire");
                //输入阶段的判断 触发阶段 才去处理逻辑
                if (context.phase == InputActionPhase.Performed)
                    Debug.LogFormat("开火");
                    break;
            case "Look":
                Debug.LogFormat("EventActionTrigger Look value:{0}", context.ReadValue<Vector2>());
                break;
            case "Move":
                Debug.LogFormat("EventActionTrigger Move value:{0}", context.ReadValue<Vector2>());
                break;
        }
    }
    #endregion

    void Update()
    {
        if (inputMove != null)
        {
            Debug.LogFormat("Update Move Value:{0}", inputMove.ReadValue<Vector2>());
        }
    }
}
